/**
 * 通用js方法封装处理
 * Copyright (c) 2019 ruoyi
 */

// 当前table相关信息
var table = {
  config: {},
  // 当前实例配置
  options: {},
  // 设置实例配置
  set: function (id) {
    if ($.common.getLength(table.config) > 1 && $.common.isNotEmpty(event)) {
      var tableId = $.common.isEmpty(id)
        ? $(event.currentTarget)
            .parents(".bootstrap-table")
            .find("table.table")
            .attr("id") ||
          $(event.currentTarget)
            .parents(".bootstrap-tree-table")
            .find("table.table")
            .attr("id")
        : id;
      if ($.common.isNotEmpty(tableId)) {
        table.options = table.get(tableId);
      }
    }
  },
  // 获取实例配置
  get: function (id) {
    return table.config[id];
  },
  // 记住选择实例组
  rememberSelecteds: {},
  // 记住选择ID组
  rememberSelectedIds: {},
};

(function ($) {
  $.extend({
    _tree: {},
    bttTable: {},
    // 表格封装处理
    table: {
      // 初始化表格参数
      init: function (options) {
        var defaults = {
          id: "bootstrap-table",
          type: 0, // 0 代表bootstrapTable 1代表bootstrapTreeTable
          method: "post",
          height: undefined,
          sidePagination: "server",
          undefinedText: "-",
          sortName: undefined,
          sortOrder: "asc",
          pagination: true,
          paginationLoop: false,
          pageSize: 10,
          pageNumber: 1,
          pageList: [10, 25, 50, 100],
          toolbar: "toolbar",
          loadingFontSize: 13,
          striped: false,
          escape: true,
          firstLoad: true,
          showFooter: false,
          search: false,
          showSearch: true,
          showPageGo: false,
          showRefresh: true,
          showColumns: true,
          showToggle: true,
          showExport: false,
          showPrint: false,
          exportDataType: "all",
          exportTypes: ["csv", "txt", "doc", "excel"],
          clickToSelect: false,
          singleSelect: false,
          mobileResponsive: true,
          maintainSelected: false,
          rememberSelected: false,
          fixedColumns: false,
          fixedNumber: 0,
          fixedRightNumber: 0,
          queryParams: $.table.queryParams,
          rowStyle: undefined,
        };
        var options = $.extend(defaults, options);
        table.options = options;
        table.config[options.id] = options;
        $.table.initEvent();
        $("#" + options.id).bootstrapTable({
          id: options.id,
          url: options.url, // 请求后台的URL（*）
          contentType: "application/x-www-form-urlencoded", // 编码类型
          method: options.method, // 请求方式（*）
          cache: false, // 是否使用缓存
          height: options.height, // 表格的高度
          striped: options.striped, // 是否显示行间隔色
          undefinedText: options.undefinedText, // 数据值为空时显示的内容
          sortable: true, // 是否启用排序
          sortStable: true, // 设置为 true 将获得稳定的排序
          sortName: options.sortName, // 排序列名称
          sortOrder: options.sortOrder, // 排序方式  asc 或者 desc
          pagination: options.pagination, // 是否显示分页（*）
          paginationLoop: options.paginationLoop, // 是否启用分页条无限循环的功能
          pageNumber: 1, // 初始化加载第一页，默认第一页
          pageSize: options.pageSize, // 每页的记录行数（*）
          pageList: options.pageList, // 可供选择的每页的行数（*）
          firstLoad: options.firstLoad, // 是否首次请求加载数据，对于数据较大可以配置false
          escape: options.escape, // 转义HTML字符串
          showFooter: options.showFooter, // 是否显示表尾
          iconSize: "outline", // 图标大小：undefined默认的按钮尺寸 xs超小按钮sm小按钮lg大按钮
          toolbar: "#" + options.toolbar, // 指定工作栏
          virtualScroll: options.virtualScroll, // 是否启动虚拟滚动（大量数据纯展示时使用)
          loadingFontSize: options.loadingFontSize, // 自定义加载文本的字体大小
          sidePagination: options.sidePagination, // server启用服务端分页client客户端分页
          search: options.search, // 是否显示搜索框功能
          searchText: options.searchText, // 搜索框初始显示的内容，默认为空
          showSearch: options.showSearch, // 是否显示检索信息
          showPageGo: options.showPageGo, // 是否显示跳转页
          showRefresh: options.showRefresh, // 是否显示刷新按钮
          showColumns: options.showColumns, // 是否显示隐藏某列下拉框
          showToggle: options.showToggle, // 是否显示详细视图和列表视图的切换按钮
          showExport: options.showExport, // 是否支持导出文件
          showPrint: options.showPrint, // 是否支持打印页面
          showHeader: options.showHeader, // 是否显示表头
          showFullscreen: options.showFullscreen, // 是否显示全屏按钮
          uniqueId: options.uniqueId, // 唯一的标识符
          clickToSelect: options.clickToSelect, // 是否启用点击选中行
          singleSelect: options.singleSelect, // 是否单选checkbox
          mobileResponsive: options.mobileResponsive, // 是否支持移动端适配
          cardView: options.cardView, // 是否启用显示卡片视图
          detailView: options.detailView, // 是否启用显示细节视图
          onCheck: options.onCheck, // 当选择此行时触发
          onUncheck: options.onUncheck, // 当取消此行时触发
          onCheckAll: options.onCheckAll, // 当全选行时触发
          onUncheckAll: options.onUncheckAll, // 当取消全选行时触发
          onClickRow: options.onClickRow, // 点击某行触发的事件
          onDblClickRow: options.onDblClickRow, // 双击某行触发的事件
          onClickCell: options.onClickCell, // 单击某格触发的事件
          onDblClickCell: options.onDblClickCell, // 双击某格触发的事件
          onEditableSave: options.onEditableSave, // 行内编辑保存的事件
          onExpandRow: options.onExpandRow, // 点击详细视图的事件
          onPostBody: options.onPostBody, // 渲染完成后执行的事件
          maintainSelected: options.maintainSelected, // 前端翻页时保留所选行
          rememberSelected: options.rememberSelected, // 启用翻页记住前面的选择
          fixedColumns: options.fixedColumns, // 是否启用冻结列（左侧）
          fixedNumber: options.fixedNumber, // 列冻结的个数（左侧）
          fixedRightNumber: options.fixedRightNumber, // 列冻结的个数（右侧）
          onReorderRow: options.onReorderRow, // 当拖拽结束后处理函数
          queryParams: options.queryParams, // 传递参数（*）
          rowStyle: options.rowStyle, // 通过自定义函数设置行样式
          footerStyle: options.footerStyle, // 通过自定义函数设置页脚样式
          headerStyle: options.headerStyle, // 通过自定义函数设置标题样式
          selectItemName: options.selectItemName, // 自定义radio/checkbox的name值
          columns: options.columns, // 显示列信息（*）
          data: options.data, // 被加载的数据
          responseHandler: $.table.responseHandler, // 在加载服务器发送来的数据之前处理函数
          onLoadSuccess: $.table.onLoadSuccess, // 当所有数据被加载时触发处理函数
          exportOptions: options.exportOptions, // 前端导出忽略列索引
          exportDataType: options.exportDataType, // 导出方式（默认all：导出所有数据；basic：导出当前页的数据；selected：导出选中的数据）
          exportTypes: options.exportTypes, // 导出文件类型 （json、xml、png、csv、txt、sql、doc、excel、xlsx、powerpoint、pdf）
          printPageBuilder: options.printPageBuilder, // 自定义打印页面模板
          detailFormatter: options.detailFormatter, // 在行下面展示其他数据列表
        });
      },
      // 获取实例ID，如存在多个返回#id1,#id2 delimeter分隔符
      getOptionsIds: function (separator) {
        var _separator = $.common.isEmpty(separator) ? "," : separator;
        var optionsIds = "";
        $.each(table.config, function (key, value) {
          optionsIds += "#" + key + _separator;
        });
        return optionsIds.substring(0, optionsIds.length - 1);
      },
      // 查询条件
      queryParams: function (params) {
        table.set();
        var curParams = {
          // 传递参数查询参数
          pageSize: params.limit,
          pageNum: params.offset / params.limit + 1,
          searchValue: params.search,
          orderByColumn: params.sort,
          isAsc: params.order,
        };
        var currentId = $.common.isEmpty(table.options.formId)
          ? $("form").attr("id")
          : table.options.formId;
        return $.extend(curParams, $.common.formToJSON(currentId));
      },
      // 请求获取数据后处理回调函数
      responseHandler: function (res) {
        if (typeof table.get(this.id).responseHandler == "function") {
          table.get(this.id).responseHandler(res);
        }
        var thisOptions = table.config[this.id];
        if (res.code == web_status.SUCCESS) {
          if (
            $.common.isNotEmpty(thisOptions.sidePagination) &&
            thisOptions.sidePagination == "client"
          ) {
            return res.rows;
          } else {
            if (
              $.common.isNotEmpty(thisOptions.rememberSelected) &&
              thisOptions.rememberSelected
            ) {
              var column = $.common.isEmpty(thisOptions.uniqueId)
                ? thisOptions.columns[1].field
                : thisOptions.uniqueId;
              $.each(res.rows, function (i, row) {
                row.state =
                  $.inArray(
                    row[column],
                    table.rememberSelectedIds[thisOptions.id]
                  ) !== -1;
              });
            }
            return { rows: res.rows, total: res.total };
          }
        } else {
          $.modal.alertWarning(res.msg);
          return { rows: [], total: 0 };
        }
      },
      // 初始化事件
      initEvent: function () {
        // 实例ID信息
        var optionsIds = $.table.getOptionsIds();
        // 监听事件处理
        $(optionsIds).on(TABLE_EVENTS, function () {
          table.set($(this).attr("id"));
        });
        // 在表格体渲染完成，并在 DOM 中可见后触发（事件）
        $(optionsIds).on("post-body.bs.table", function (e, args) {
          // 浮动提示框特效
          $(".table [data-toggle='tooltip']").tooltip();
          // 气泡弹出框特效
          $('.table [data-toggle="popover"]').popover();
        });
        // 选中、取消、全部选中、全部取消（事件）
        $(optionsIds).on(
          "check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table",
          function (e, rowsAfter, rowsBefore) {
            // 复选框分页保留保存选中数组
            var rows = $.common.equals("uncheck-all", e.type)
              ? rowsBefore
              : rowsAfter;
            var rowIds = $.table.affectedRowIds(rows);
            if (
              $.common.isNotEmpty(table.options.rememberSelected) &&
              table.options.rememberSelected
            ) {
              func =
                $.inArray(e.type, ["check", "check-all"]) > -1
                  ? "union"
                  : "difference";
              var selectedIds = table.rememberSelectedIds[table.options.id];
              if ($.common.isNotEmpty(selectedIds)) {
                table.rememberSelectedIds[table.options.id] = _[func](
                  selectedIds,
                  rowIds
                );
              } else {
                table.rememberSelectedIds[table.options.id] = _[func](
                  [],
                  rowIds
                );
              }
              var selectedRows = table.rememberSelecteds[table.options.id];
              if ($.common.isNotEmpty(selectedRows)) {
                table.rememberSelecteds[table.options.id] = _[func](
                  selectedRows,
                  rows
                );
              } else {
                table.rememberSelecteds[table.options.id] = _[func]([], rows);
              }
            }
          }
        );
        // 加载成功、选中、取消、全部选中、全部取消（事件）
        $(optionsIds).on(
          "check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table load-success.bs.table",
          function () {
            var toolbar = table.options.toolbar;
            var uniqueId = table.options.uniqueId;
            // 工具栏按钮控制
            var rows = $.common.isEmpty(uniqueId)
              ? $.table.selectFirstColumns()
              : $.table.selectColumns(uniqueId);
            // 非多个禁用
            $("#" + toolbar + " .multiple").toggleClass(
              "disabled",
              !rows.length
            );
            // 非单个禁用
            $("#" + toolbar + " .single").toggleClass(
              "disabled",
              rows.length != 1
            );
          }
        );
        // 图片预览事件
        $(optionsIds)
          .off("click")
          .on("click", ".img-circle", function () {
            var src = $(this).attr("src");
            var target = $(this).data("target");
            if ($.common.equals("self", target)) {
              var height = $(this).data("height");
              var width = $(this).data("width");
              top.layer.open({
                title: false,
                type: 1,
                closeBtn: true,
                shadeClose: true,
                content:
                  "<img src='" +
                  src +
                  "' height='" +
                  height +
                  "' width='" +
                  width +
                  "'/>",
              });
            } else if ($.common.equals("blank", target)) {
              window.open(src);
            }
          });
        // 单击tooltip事件
        $(optionsIds).on("click", ".tooltip-show", function () {
          var target = $(this).data("target");
          var input = $(this).prev();
          if ($.common.equals("copy", target)) {
            input.select();
            document.execCommand("copy");
          } else if ($.common.equals("open", target)) {
            top.layer.alert(input.val(), {
              title: "信息内容",
              area: ["400px", ""],
              shadeClose: true,
              btn: ["关闭"],
              btnclass: ["btn btn-primary"],
            });
          }
        });
      },
      // 当所有数据被加载时触发
      onLoadSuccess: function (data) {
        if (typeof table.options.onLoadSuccess == "function") {
          table.options.onLoadSuccess(data);
        }
      },
      // 表格销毁
      destroy: function (tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("destroy");
        delete table.rememberSelectedIds[currentId];
        delete table.rememberSelecteds[currentId];
      },
      // 序列号生成
      serialNumber: function (index, tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        var tableParams = $("#" + currentId).bootstrapTable("getOptions");
        var pageSize = $.common.isNotEmpty(tableParams.pageSize)
          ? tableParams.pageSize
          : table.options.pageSize;
        var pageNumber = $.common.isNotEmpty(tableParams.pageNumber)
          ? tableParams.pageNumber
          : table.options.pageNumber;
        if (table.options.sidePagination == "client") {
          return index + 1;
        }
        return pageSize * (pageNumber - 1) + index + 1;
      },
      // 列超出指定长度浮动提示 target（copy单击复制文本 open弹窗打开文本）
      tooltip: function (value, length, target) {
        var _length = $.common.isEmpty(length) ? 20 : length;
        var _text = "";
        var _value = $.common.nullToStr(value);
        var _target = $.common.isEmpty(target) ? "copy" : target;
        if (_value.length > _length) {
          _text = _value.substr(0, _length) + "...";
          _value = _value.replace(/\'/g, "&apos;");
          _value = _value.replace(/\"/g, "&quot;");
          var actions = [];
          actions.push(
            $.common.sprintf(
              '<input style="opacity: 0;position: absolute;z-index:-1" type="text" value="%s"/>',
              _value
            )
          );
          actions.push(
            $.common.sprintf(
              '<a href="###" class="tooltip-show" data-toggle="tooltip" data-target="%s" title="%s">%s</a>',
              _target,
              _value,
              _text
            )
          );
          return actions.join("");
        } else {
          _text = _value;
          return _text;
        }
      },
      // 下拉按钮切换
      dropdownToggle: function (value) {
        var actions = [];
        actions.push('<div class="btn-group">');
        actions.push(
          '<button type="button" class="btn btn-xs dropdown-toggle" data-toggle="dropdown" aria-expanded="false">'
        );
        actions.push(
          '<i class="fa fa-cog"></i>&nbsp;<span class="fa fa-chevron-down"></span></button>'
        );
        actions.push('<ul class="dropdown-menu">');
        actions.push(
          value.replace(/<a/g, "<li><a").replace(/<\/a>/g, "</a></li>")
        );
        actions.push("</ul>");
        actions.push("</div>");
        return actions.join("");
      },
      // 图片预览
      imageView: function (value, height, width, target) {
        if ($.common.isEmpty(width)) {
          width = "auto";
        }
        if ($.common.isEmpty(height)) {
          height = "auto";
        }
        // blank or self
        var _target = $.common.isEmpty(target) ? "self" : target;
        if ($.common.isNotEmpty(value)) {
          return $.common.sprintf(
            "<img class='img-circle img-xs' data-height='%s' data-width='%s' data-target='%s' src='%s'/>",
            height,
            width,
            _target,
            value
          );
        } else {
          return $.common.nullToStr(value);
        }
      },
      // 搜索-默认第一个form
      search: function (formId, tableId, pageNumber, pageSize) {
        table.set(tableId);
        table.options.formId = $.common.isEmpty(formId)
          ? $("form").attr("id")
          : formId;
        var params = $.common.isEmpty(tableId)
          ? $("#" + table.options.id).bootstrapTable("getOptions")
          : $("#" + tableId).bootstrapTable("getOptions");
        if ($.common.isNotEmpty(pageNumber)) {
          params.pageNumber = pageNumber;
        }
        if ($.common.isNotEmpty(pageSize)) {
          params.pageSize = pageSize;
        }
        if ($.common.isNotEmpty(tableId)) {
          $("#" + tableId).bootstrapTable("refresh", params);
        } else {
          $("#" + table.options.id).bootstrapTable("refresh", params);
        }
      },
      // 导出数据
      exportExcel: function (formId) {
        table.set();
        $.modal.confirm(
          "确定导出所有" + table.options.modalName + "吗？",
          function () {
            var currentId = $.common.isEmpty(formId)
              ? $("form").attr("id")
              : formId;
            var params = $("#" + table.options.id).bootstrapTable("getOptions");
            var dataParam = $("#" + currentId).serializeArray();
            dataParam.push({ name: "orderByColumn", value: params.sortName });
            dataParam.push({ name: "isAsc", value: params.sortOrder });
            $.modal.loading("正在导出数据，请稍候...");
            $.post(table.options.exportUrl, dataParam, function (result) {
              if (result.code == web_status.SUCCESS) {
                window.location.href =
                  ctx +
                  "common/download?fileName=" +
                  encodeURI(result.msg) +
                  "&delete=" +
                  true;
              } else if (result.code == web_status.WARNING) {
                $.modal.alertWarning(result.msg);
              } else {
                $.modal.alertError(result.msg);
              }
              $.modal.closeLoading();
            });
          }
        );
      },
      // 下载模板
      importTemplate: function () {
        $.get(
          activeWindow().table.options.importTemplateUrl,
          function (result) {
            if (result.code == web_status.SUCCESS) {
              window.location.href =
                ctx +
                "common/download?fileName=" +
                encodeURI(result.msg) +
                "&delete=" +
                true;
            } else if (result.code == web_status.WARNING) {
              $.modal.alertWarning(result.msg);
            } else {
              $.modal.alertError(result.msg);
            }
          }
        );
      },
      // 导入数据
      importExcel: function (formId, width, height) {
        table.set();
        var currentId = $.common.isEmpty(formId) ? "importTpl" : formId;
        var _width = $.common.isEmpty(width) ? "400" : width;
        var _height = $.common.isEmpty(height) ? "230" : height;
        top.layer.open({
          type: 1,
          area: [_width + "px", _height + "px"],
          offset: "auto", // 确保弹窗居中
          fix: false,
          //不固定
          maxmin: true,
          shade: 0.3,
          title: "导入" + table.options.modalName + "数据",
          content: $("#" + currentId).html(),
          btn: [
            '<i class="fa fa-check"></i> 导入',
            '<i class="fa fa-remove"></i> 取消',
          ],
          // 弹层外区域关闭
          shadeClose: true,
          btn1: function (index, layero) {
            var file = layero.find("#file").val();
            if (
              file == "" ||
              (!$.common.endWith(file, ".xls") &&
                !$.common.endWith(file, ".xlsx"))
            ) {
              $.modal.msgWarning("请选择后缀为 “xls”或“xlsx”的文件。");
              return false;
            }
            var index = top.layer.load(2, { shade: false });
            $.modal.disable();
            var formData = new FormData(layero.find("form")[0]);
            $.ajax({
              url: table.options.importUrl,
              data: formData,
              cache: false,
              contentType: false,
              processData: false,
              type: "POST",
              success: function (result) {
                if (result.code == web_status.SUCCESS) {
                  $.modal.close(index);
                  $.modal.closeAll();
                  $.modal.alertSuccess(result.msg);
                  $.table.refresh();
                } else if (result.code == web_status.WARNING) {
                  $.modal.close(index);
                  $.modal.enable();
                  $.modal.alertWarning(result.msg);
                } else {
                  $.modal.close(index);
                  $.modal.enable();
                  $.modal.alertError(result.msg);
                }
              },
              complete: function () {
                layero.find("#file").val("");
              },
            });
          },
        });
      },
      // 刷新表格
      refresh: function (tableId, pageNumber, pageSize, url) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        var params = $("#" + currentId).bootstrapTable("getOptions");
        if ($.common.isEmpty(pageNumber)) {
          pageNumber = params.pageNumber;
        }
        if ($.common.isEmpty(pageSize)) {
          pageSize = params.pageSize;
        }
        if ($.common.isEmpty(url)) {
          url = $.common.isEmpty(url) ? params.url : url;
        }
        $("#" + currentId).bootstrapTable("refresh", {
          silent: true,
          url: url,
          pageNumber: pageNumber,
          pageSize: pageSize,
        });
      },
      // 刷新options配置
      refreshOptions: function (options, tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("refreshOptions", options);
      },
      // 查询表格指定列值 deDuplication（ true去重、false不去重）
      selectColumns: function (column, deDuplication) {
        var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication;
        var rows = $.map(
          $("#" + table.options.id).bootstrapTable("getSelections"),
          function (row) {
            return $.common.getItemField(row, column);
          }
        );
        if (
          $.common.isNotEmpty(table.options.rememberSelected) &&
          table.options.rememberSelected
        ) {
          var selectedRows = table.rememberSelecteds[table.options.id];
          if ($.common.isNotEmpty(selectedRows)) {
            rows = $.map(
              table.rememberSelecteds[table.options.id],
              function (row) {
                return $.common.getItemField(row, column);
              }
            );
          }
        }
        return distinct ? $.common.uniqueFn(rows) : rows;
      },
      // 获取当前页选中或者取消的行ID
      affectedRowIds: function (rows) {
        var column = $.common.isEmpty(table.options.uniqueId)
          ? table.options.columns[1].field
          : table.options.uniqueId;
        var rowIds;
        if ($.isArray(rows)) {
          rowIds = $.map(rows, function (row) {
            return $.common.getItemField(row, column);
          });
        } else {
          rowIds = [rows[column]];
        }
        return rowIds;
      },
      // 查询表格首列值deDuplication（ true去重、false不去重）
      selectFirstColumns: function (deDuplication) {
        var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication;
        var rows = $.map(
          $("#" + table.options.id).bootstrapTable("getSelections"),
          function (row) {
            return $.common.getItemField(row, table.options.columns[1].field);
          }
        );
        if (
          $.common.isNotEmpty(table.options.rememberSelected) &&
          table.options.rememberSelected
        ) {
          var selectedRows = table.rememberSelecteds[table.options.id];
          if ($.common.isNotEmpty(selectedRows)) {
            rows = $.map(selectedRows, function (row) {
              return $.common.getItemField(row, table.options.columns[1].field);
            });
          }
        }
        return distinct ? $.common.uniqueFn(rows) : rows;
      },
      // 回显数据字典
      selectDictLabel: function (datas, value) {
        if ($.common.isEmpty(datas) || $.common.isEmpty(value)) {
          return "";
        }
        var actions = [];
        $.each(datas, function (index, dict) {
          if (dict.dictValue == "" + value) {
            var listClass =
              $.common.equals("default", dict.listClass) ||
              $.common.isEmpty(dict.listClass)
                ? ""
                : "badge badge-" + dict.listClass;
            var cssClass = $.common.isNotEmpty(dict.cssClass)
              ? dict.cssClass
              : listClass;
            actions.push(
              $.common.sprintf(
                "<span class='%s'>%s</span>",
                cssClass,
                dict.dictLabel
              )
            );
            return false;
          }
        });
        if (actions.length === 0) {
          actions.push($.common.sprintf("<span>%s</span>", value));
        }
        return actions.join("");
      },
      // 回显数据字典（字符串数组）
      selectDictLabels: function (datas, value, separator) {
        if ($.common.isEmpty(datas) || $.common.isEmpty(value)) {
          return "";
        }
        var currentSeparator = $.common.isEmpty(separator) ? "," : separator;
        var actions = [];
        $.each(value.split(currentSeparator), function (i, val) {
          var match = false;
          $.each(datas, function (index, dict) {
            if (dict.dictValue == "" + val) {
              var listClass =
                $.common.equals("default", dict.listClass) ||
                $.common.isEmpty(dict.listClass)
                  ? ""
                  : "badge badge-" + dict.listClass;
              actions.push(
                $.common.sprintf(
                  "<span class='%s'>%s</span>",
                  listClass,
                  dict.dictLabel
                )
              );
              match = true;
              return false;
            }
          });
          if (!match) {
            actions.push($.common.sprintf("<span> %s </span>", val));
          }
        });
        return actions.join("");
      },
      // 显示表格指定列
      showColumn: function (column, tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("showColumn", column);
      },
      // 隐藏表格指定列
      hideColumn: function (column, tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("hideColumn", column);
      },
      // 显示所有表格列
      showAllColumns: function (tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("showAllColumns");
      },
      // 隐藏所有表格列
      hideAllColumns: function (tableId) {
        var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        $("#" + currentId).bootstrapTable("hideAllColumns");
      },
    },
    // 表格树封装处理
    treeTable: {
      // 初始化表格
      init: function (options) {
        var defaults = {
          id: "bootstrap-tree-table",
          type: 1, // 0 代表bootstrapTable 1代表bootstrapTreeTable
          height: 0,
          rootIdValue: 0,
          ajaxParams: {},
          toolbar: "toolbar",
          striped: false,
          pagination: false,
          pageSize: 10,
          pageList: [10, 25, 50],
          expandColumn: 1,
          showSearch: true,
          showRefresh: true,
          showColumns: true,
          expandAll: true,
          expandFirst: true,
        };
        var options = $.extend(defaults, options);
        table.options = options;
        table.config[options.id] = options;
        $.table.initEvent();
        $.bttTable = $("#" + options.id).bootstrapTreeTable({
          code: options.code, // 用于设置父子关系
          parentCode: options.parentCode, // 用于设置父子关系
          type: "post", // 请求方式（*）
          url: options.url, // 请求后台的URL（*）
          data: options.data, // 无url时用于渲染的数据
          ajaxParams: options.ajaxParams, // 请求数据的ajax的data属性
          rootIdValue: options.rootIdValue, // 设置指定根节点id值
          height: options.height, // 表格树的高度
          pagination: options.pagination, // 是否显示分页
          dataUrl: options.dataUrl, // 加载子节点异步请求数据url
          pageSize: options.pageSize, // 每页的记录行数
          pageList: options.pageList, // 可供选择的每页的行数
          expandColumn: options.expandColumn, // 在哪一列上面显示展开按钮
          striped: options.striped, // 是否显示行间隔色
          bordered: options.bordered, // 是否显示边框
          toolbar: "#" + options.toolbar, // 指定工作栏
          showSearch: options.showSearch, // 是否显示检索信息
          showRefresh: options.showRefresh, // 是否显示刷新按钮
          showColumns: options.showColumns, // 是否显示隐藏某列下拉框
          expandAll: options.expandAll, // 是否全部展开
          expandFirst: options.expandFirst, // 是否默认第一级展开--expandAll为false时生效
          columns: options.columns, // 显示列信息（*）
          onClickRow: options.onClickRow, // 单击某行事件
          responseHandler: $.treeTable.responseHandler, // 在加载服务器发送来的数据之前处理函数
          onLoadSuccess: $.treeTable.onLoadSuccess, // 当所有数据被加载时触发处理函数
        });
      },
      // 条件查询
      search: function (formId) {
        var currentId = $.common.isEmpty(formId)
          ? $("form").attr("id")
          : formId;
        var params = $.common.formToJSON(currentId);
        $.bttTable.bootstrapTreeTable(
          "refresh",
          $.extend(params, table.options.ajaxParams)
        );
      },
      // 刷新
      refresh: function () {
        $.bttTable.bootstrapTreeTable("refresh");
      },
      // 查询表格树指定列值deDuplication（ true去重、false不去重）
      selectColumns: function (column, deDuplication) {
        var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication;
        var rows = $.map(
          $.bttTable.bootstrapTreeTable("getSelections"),
          function (row) {
            return $.common.getItemField(row, column);
          }
        );
        return distinct ? $.common.uniqueFn(rows) : rows;
      },
      // 请求获取数据后处理回调函数，校验异常状态提醒
      responseHandler: function (res) {
        if (typeof table.options.responseHandler == "function") {
          table.options.responseHandler(res);
        }
        if (res.code != undefined && res.code != web_status.SUCCESS) {
          $.modal.alertWarning(res.msg);
          return [];
        } else {
          return res;
        }
      },
      // 当所有数据被加载时触发
      onLoadSuccess: function (data) {
        if (typeof table.options.onLoadSuccess == "function") {
          table.options.onLoadSuccess(data);
        }
        $(".table [data-toggle='tooltip']").tooltip();
      },
    },
    // 表单封装处理
    form: {
      // 表单重置
      reset: function (formId, tableId, pageNumber, pageSize) {
        table.set(tableId);
        formId = $.common.isEmpty(formId) ? $("form").attr("id") : formId;
        $("#" + formId)[0].reset();
        var tableId = $.common.isEmpty(tableId) ? table.options.id : tableId;
        if (table.options.type == table_type.bootstrapTable) {
          var params = $("#" + tableId).bootstrapTable("getOptions");
          params.pageNumber = 1;
          if ($.common.isNotEmpty(pageSize)) {
            params.pageSize = pageSize;
          }
          $("#" + tableId).bootstrapTable("refresh", params);
        } else if (table.options.type == table_type.bootstrapTreeTable) {
          $("#" + tableId).bootstrapTreeTable(
            "refresh",
            table.options.ajaxParams
          );
        }
        resetDate();
      },
      // 获取选中复选框项
      selectCheckeds: function (name) {
        var checkeds = "";
        $('input:checkbox[name="' + name + '"]:checked').each(function (i) {
          if (0 == i) {
            checkeds = $(this).val();
          } else {
            checkeds += "," + $(this).val();
          }
        });
        return checkeds;
      },
      // 获取选中下拉框项
      selectSelects: function (name) {
        var selects = "";
        $("#" + name + " option:selected").each(function (i) {
          if (0 == i) {
            selects = $(this).val();
          } else {
            selects += "," + $(this).val();
          }
        });
        return selects;
      },
    },
    // 弹出层封装处理
    modal: {
      // 显示图标
      icon: function (type) {
        var icon = "";
        if (type == modal_status.WARNING) {
          icon = 0;
        } else if (type == modal_status.SUCCESS) {
          icon = 1;
        } else if (type == modal_status.FAIL) {
          icon = 2;
        } else {
          icon = 3;
        }
        return icon;
      },
      // 消息提示
      msg: function (content, type) {
        if (type != undefined) {
          top.layer.msg(content, {
            icon: $.modal.icon(type),
            time: 1000,
            shift: 5,
          });
        } else {
          top.layer.msg(content);
        }
      },
      // 错误消息
      msgError: function (content) {
        $.modal.msg(content, modal_status.FAIL);
      },
      // 成功消息
      msgSuccess: function (content) {
        $.modal.msg(content, modal_status.SUCCESS);
      },
      // 警告消息
      msgWarning: function (content) {
        $.modal.msg(content, modal_status.WARNING);
      },
      // 弹出提示
      alert: function (content, type) {
        top.layer.alert(content, {
          icon: $.modal.icon(type),
          title: "系统提示",
          btn: ["关闭"],
          btnclass: ["btn btn-primary"],
        });
      },
      // 错误提示
      alertError: function (content) {
        $.modal.alert(content, modal_status.FAIL);
      },
      // 成功提示
      alertSuccess: function (content) {
        $.modal.alert(content, modal_status.SUCCESS);
      },
      // 警告提示
      alertWarning: function (content) {
        $.modal.alert(content, modal_status.WARNING);
      },
      // 消息提示，重新加载页面
      msgReload: function (msg, type) {
        top.layer.msg(
          msg,
          {
            icon: $.modal.icon(type),
            time: 500,
            shade: [0.1, "#8F8F8F"],
          },
          function () {
            $.modal.reload();
          }
        );
      },
      // 消息提示成功并刷新父窗体
      msgSuccessReload: function (msg) {
        $.modal.msgReload(msg, modal_status.SUCCESS);
      },
      // 获取iframe页的DOM
      getChildFrame: function (index) {
        if ($.common.isEmpty(index)) {
          var index = parent.layer.getFrameIndex(window.name);
          return parent.layer.getChildFrame("body", index);
        } else {
          return top.layer.getChildFrame("body", index);
        }
      },
      // 关闭窗体
      close: function (index) {
        if ($.common.isEmpty(index)) {
          var index = parent.layer.getFrameIndex(window.name);
          parent.layer.close(index);
        } else {
          top.layer.close(index);
        }
      },
      // 关闭全部窗体
      closeAll: function () {
        top.layer.closeAll();
      },
      // 确认窗体
      confirm: function (content, callBack) {
        top.layer.confirm(
          content,
          {
            icon: 3,
            title: "系统提示",
            btn: ["确认", "取消"],
          },
          function (index) {
            $.modal.close(index);
            callBack(true);
          }
        );
      },
      // 弹出层指定宽度
      open: function (title, url, width, height, callback) {
        // 如果是移动端，就使用自适应大小弹窗
        if ($.common.isMobile()) {
          width = "auto";
          height = "auto";
        }
        if ($.common.isEmpty(title)) {
          title = false;
        }
        if ($.common.isEmpty(url)) {
          url = "/404.html";
        }
        if ($.common.isEmpty(width)) {
          width = 800;
        }
        if ($.common.isEmpty(height)) {
          height = $(window).height() - 50;
        }
        if ($.common.isEmpty(callback)) {
          callback = function (index, layero) {
            var iframeWin = layero.find("iframe")[0];
            console.log(iframeWin, "iframeWiniframeWin");

            iframeWin.contentWindow.submitHandler(index, layero);
          };
        }
        var index = top.layer.open({
          type: 2,
          area: [width + "px", height + "px"],
          offset: "auto", // 确保弹窗居中
          fix: false,
          //不固定
          maxmin: true,
          shade: 0.3,
          title: title,
          content: url,
          btn: ["确定", "关闭"],
          // 弹层外区域关闭
          shadeClose: true,
          yes: callback,
          cancel: function (index) {
            return true;
          },
          success: function () {
            $(":focus").blur();
          },
        });
        // 自动全屏显示
        top.layer.full(index);
      },
      // 弹出层指定参数选项
      openOptions: function (options) {
        var _url = $.common.isEmpty(options.url) ? "/404.html" : options.url;
        var _title = $.common.isEmpty(options.title)
          ? "系统窗口"
          : options.title;
        // 设置默认尺寸，如果没有指定width和height，则使用800x600作为默认值
        var _width = $.common.isEmpty(options.width) ? "800" : options.width;
        var _height = $.common.isEmpty(options.height)
          ? $(window).height() - 50
          : options.height;

        // 判断是否需要全屏显示
        var willBeFullScreen =
          $.common.isEmpty(options.width) && $.common.isEmpty(options.height);
        var _btn = [
          '<i class="fa fa-check"></i> 确认',
          '<i class="fa fa-close"></i> 关闭',
        ];
        // 如果是移动端，就使用自适应大小弹窗
        if ($.common.isMobile()) {
          _width = "auto";
          _height = "auto";
        }
        if ($.common.isEmpty(options.yes)) {
          options.yes = function (index, layero) {
            options.callBack(index, layero);
          };
        }
        var btnCallback = {};
        if (options.btn instanceof Array) {
          for (var i = 1, len = options.btn.length; i < len; i++) {
            var btn = options["btn" + (i + 1)];
            if (btn) {
              btnCallback["btn" + (i + 1)] = btn;
            }
          }
        }
        var index = top.layer.open(
          $.extend(
            {
              id: options.id, // 唯一id
              anim: options.anim, // 弹出动画 0-6
              type: 2,
              maxmin: $.common.isEmpty(options.maxmin) ? true : options.maxmin,
              shade: 0.3,
              title: _title,
              fix: false,
              area: [_width + "px", _height + "px"],
              offset: "auto", // 确保弹窗居中
              content: _url,
              closeBtn: $.common.isEmpty(options.closeBtn)
                ? 1
                : options.closeBtn,
              shadeClose: $.common.isEmpty(options.shadeClose)
                ? true
                : options.shadeClose,
              skin: options.skin,
              // options.btn设置为0表示不显示按钮
              btn: $.common.isEmpty(options.btn) ? _btn : options.btn,
              yes: options.yes,
              cancel: function () {
                return true;
              },
              success: function () {
                $(":focus").blur();
                // 如果需要全屏显示，则在弹窗创建成功后全屏化
                if (willBeFullScreen) {
                  top.layer.full(index);
                }
              },
            },
            btnCallback
          )
        );
      },
      // 弹出层全屏
      openFull: function (title, url, width, height) {
        // 如果是移动端，就使用自适应大小弹窗
        if ($.common.isMobile()) {
          width = "auto";
          height = "auto";
        }
        if ($.common.isEmpty(title)) {
          title = false;
        }
        if ($.common.isEmpty(url)) {
          url = "/404.html";
        }
        if ($.common.isEmpty(width)) {
          width = 800;
        }
        if ($.common.isEmpty(height)) {
          height = $(window).height() - 50;
        }
        var index = top.layer.open({
          type: 2,
          area: [width + "px", height + "px"],
          offset: "auto", // 确保弹窗居中
          fix: false,
          //不固定
          maxmin: true,
          shade: 0.3,
          title: title,
          content: url,
          btn: ["确定", "关闭"],
          // 弹层外区域关闭
          shadeClose: true,
          yes: function (index, layero) {
            var iframeWin = layero.find("iframe")[0];
            iframeWin.contentWindow.submitHandler(index, layero);
          },
          cancel: function (index) {
            return true;
          },
          success: function () {
            $(":focus").blur();
          },
        });
        top.layer.full(index);
      },
      // 选卡页方式打开
      openTab: function (title, url, isRefresh) {
        createMenuItem(url, title, isRefresh);
      },
      // 选卡页同一页签打开
      parentTab: function (title, url) {
        var dataId = window.frameElement.getAttribute("data-id");
        createMenuItem(url, title);
        closeItem(dataId);
      },
      // 右侧弹出窗口打开
      popupRight: function (title, url) {
        var width = 150;
        if (top.location !== self.location) {
          if ($(top.window).outerWidth() < 400) {
            width = 50;
          }
        }
        top.layer.open({
          type: 2,
          offset: "r",
          anim: "slideLeft",
          move: false,
          title: title,
          shade: 0.3,
          shadeClose: true,
          area: [$(window).outerWidth() - width + "px", "100%"],
          content: url,
        });
      },
      // 关闭选项卡
      closeTab: function (dataId) {
        closeItem(dataId);
      },
      // 禁用按钮
      disable: function () {
        var doc =
          window.top == window.parent
            ? top.window.document
            : window.parent.document;
        $("a[class*=layui-layer-btn]", doc).addClass("layer-disabled");
      },
      // 启用按钮
      enable: function () {
        var doc =
          window.top == window.parent
            ? top.window.document
            : window.parent.document;
        $("a[class*=layui-layer-btn]", doc).removeClass("layer-disabled");
      },
      // 打开遮罩层
      loading: function (message) {
        $.blockUI({
          message:
            '<div class="loaderbox"><div class="loading-activity"></div> ' +
            message +
            "</div>",
        });
      },
      // 关闭遮罩层
      closeLoading: function () {
        setTimeout(function () {
          $.unblockUI();
        }, 50);
      },
      // 重新加载
      reload: function () {
        parent.location.reload();
      },
    },
    // 操作封装处理
    operate: {
      // 提交数据
      submit: function (url, type, dataType, data, callback) {
        var config = {
          url: url,
          type: type,
          dataType: dataType,
          data: data,
          beforeSend: function (xhr, settings) {
            var csrftoken = $("meta[name=csrf-token]").attr("content");
            if ($.common.equalsIgnoreCase(settings.type, "POST")) {
              xhr.setRequestHeader("X-CSRF-Token", csrftoken);
            }
            $.modal.loading("正在处理中，请稍候...");
          },
          success: function (result) {
            if (typeof callback == "function") {
              callback(result);
            }
            $.operate.ajaxSuccess(result);
          },
        };
        $.ajax(config);
      },
      // post请求传输
      post: function (url, data, callback) {
        $.operate.submit(url, "post", "json", data, callback);
      },
      // get请求传输
      get: function (url, callback) {
        $.operate.submit(url, "get", "json", "", callback);
      },
      // 详细信息
      detail: function (id, width, height) {
        table.set();
        var _url = $.operate.detailUrl(id);
        var options = {
          title: table.options.modalName + "详细",
          width: width,
          height: height,
          url: _url,
          btn: 0,
          yes: function (index, layero) {
            $.modal.close(index);
          },
        };
        $.modal.openOptions(options);
      },
      // 详细信息，以tab页展现
      detailTab: function (id) {
        table.set();
        $.modal.openTab(
          "详细" + table.options.modalName,
          $.operate.detailUrl(id)
        );
      },
      // 详细访问地址
      detailUrl: function (id) {
        var url = "/404.html";
        if ($.common.isNotEmpty(id)) {
          url = table.options.detailUrl.replace("{id}", id);
        } else {
          var id = $.common.isEmpty(table.options.uniqueId)
            ? $.table.selectFirstColumns()
            : $.table.selectColumns(table.options.uniqueId);
          if (id.length == 0) {
            $.modal.alertWarning("请至少选择一条记录");
            return;
          }
          url = table.options.detailUrl.replace("{id}", id);
        }
        return url;
      },
      // 删除信息
      remove: function (id) {
        table.set();
        $.modal.confirm(
          "确定删除该条" + table.options.modalName + "信息吗？",
          function () {
            var url = $.common.isEmpty(id)
              ? table.options.removeUrl
              : table.options.removeUrl.replace("{id}", id);
            if (table.options.type == table_type.bootstrapTreeTable) {
              $.operate.get(url);
            } else {
              var data = { ids: id };
              $.operate.submit(url, "post", "json", data);
            }
          }
        );
      },
      // 批量删除信息
      removeAll: function () {
        table.set();
        var rows = $.common.isEmpty(table.options.uniqueId)
          ? $.table.selectFirstColumns()
          : $.table.selectColumns(table.options.uniqueId);
        if (rows.length == 0) {
          $.modal.alertWarning("请至少选择一条记录");
          return;
        }
        $.modal.confirm(
          "确认要删除选中的" + rows.length + "条数据吗?",
          function () {
            var url = table.options.removeUrl;
            var data = { ids: rows.join() };
            $.operate.submit(url, "post", "json", data);
          }
        );
      },
      // 清空信息
      clean: function () {
        table.set();
        $.modal.confirm(
          "确定清空所有" + table.options.modalName + "吗？",
          function () {
            var url = table.options.cleanUrl;
            $.operate.submit(url, "post", "json", "");
          }
        );
      },
      // 添加信息
      add: function (id) {
        table.set();
        $.modal.open("添加" + table.options.modalName, $.operate.addUrl(id));
      },
      // 添加信息，以tab页展现
      addTab: function (id) {
        table.set();
        $.modal.openTab("添加" + table.options.modalName, $.operate.addUrl(id));
      },
      // 添加信息 全屏
      addFull: function (id) {
        table.set();
        $.modal.openFull(
          "添加" + table.options.modalName,
          $.operate.addUrl(id)
        );
      },
      // 添加访问地址
      addUrl: function (id) {
        var url = $.common.isEmpty(id)
          ? table.options.createUrl.replace("{id}", "")
          : table.options.createUrl.replace("{id}", id);
        return url;
      },
      // 修改信息
      edit: function (id) {
        table.set();
        if (
          $.common.isEmpty(id) &&
          table.options.type == table_type.bootstrapTreeTable
        ) {
          var row = $("#" + table.options.id).bootstrapTreeTable(
            "getSelections"
          )[0];
          if ($.common.isEmpty(row)) {
            $.modal.alertWarning("请至少选择一条记录");
            return;
          }
          var url = table.options.updateUrl.replace(
            "{id}",
            row[table.options.uniqueId]
          );
          $.modal.open("修改" + table.options.modalName, url);
        } else {
          $.modal.open("修改" + table.options.modalName, $.operate.editUrl(id));
        }
      },
      // 修改信息，以tab页展现
      editTab: function (id) {
        table.set();
        $.modal.openTab(
          "修改" + table.options.modalName,
          $.operate.editUrl(id)
        );
      },
      // 修改信息 全屏
      editFull: function (id) {
        table.set();
        var url = "/404.html";
        if ($.common.isNotEmpty(id)) {
          url = table.options.updateUrl.replace("{id}", id);
        } else {
          if (table.options.type == table_type.bootstrapTreeTable) {
            var row = $("#" + table.options.id).bootstrapTreeTable(
              "getSelections"
            )[0];
            if ($.common.isEmpty(row)) {
              $.modal.alertWarning("请至少选择一条记录");
              return;
            }
            url = table.options.updateUrl.replace(
              "{id}",
              row[table.options.uniqueId]
            );
          } else {
            var row = $.common.isEmpty(table.options.uniqueId)
              ? $.table.selectFirstColumns()
              : $.table.selectColumns(table.options.uniqueId);
            url = table.options.updateUrl.replace("{id}", row);
          }
        }
        $.modal.openFull("修改" + table.options.modalName, url);
      },
      // 修改访问地址
      editUrl: function (id) {
        var url = "/404.html";
        if ($.common.isNotEmpty(id)) {
          url = table.options.updateUrl.replace("{id}", id);
        } else {
          var id = $.common.isEmpty(table.options.uniqueId)
            ? $.table.selectFirstColumns()
            : $.table.selectColumns(table.options.uniqueId);
          if (id.length == 0) {
            $.modal.alertWarning("请至少选择一条记录");
            return;
          }
          url = table.options.updateUrl.replace("{id}", id);
        }
        return url;
      },
      // 右侧弹出详情
      view: function (id) {
        table.set();
        var url = table.options.viewUrl.replace("{id}", id);
        $.modal.popupRight(table.options.modalName + "信息详情", url);
      },
      // 保存信息 刷新表格
      save: function (url, data, callback) {
        var config = {
          url: url,
          type: "post",
          dataType: "json",
          data: data,
          beforeSend: function (xhr, settings) {
            var csrftoken = $("meta[name=csrf-token]").attr("content");
            if ($.common.equalsIgnoreCase(settings.type, "POST")) {
              xhr.setRequestHeader("X-CSRF-Token", csrftoken);
            }
            $.modal.loading("正在处理中，请稍候...");
            $.modal.disable();
          },
          success: function (result) {
            if (typeof callback == "function") {
              callback(result);
            }
            $.operate.successCallback(result);
          },
        };
        $.ajax(config);
      },
      // 保存信息 弹出结果提示框
      saveModal: function (url, data, callback) {
        var config = {
          url: url,
          type: "post",
          dataType: "json",
          data: data,
          beforeSend: function (xhr, settings) {
            var csrftoken = $("meta[name=csrf-token]").attr("content");
            if ($.common.equalsIgnoreCase(settings.type, "POST")) {
              xhr.setRequestHeader("X-CSRF-Token", csrftoken);
            }
            $.modal.loading("正在处理中，请稍候...");
          },
          success: function (result) {
            if (typeof callback == "function") {
              callback(result);
            }
            if (result.code == web_status.SUCCESS) {
              $.modal.alertSuccess(result.msg);
            } else if (result.code == web_status.WARNING) {
              $.modal.alertWarning(result.msg);
            } else {
              $.modal.alertError(result.msg);
            }
            $.modal.closeLoading();
          },
        };
        $.ajax(config);
      },
      // 保存选项卡信息
      saveTab: function (url, data, callback) {
        var config = {
          url: url,
          type: "post",
          dataType: "json",
          data: data,
          beforeSend: function (xhr, settings) {
            var csrftoken = $("meta[name=csrf-token]").attr("content");
            if ($.common.equalsIgnoreCase(settings.type, "POST")) {
              xhr.setRequestHeader("X-CSRF-Token", csrftoken);
            }
            $.modal.loading("正在处理中，请稍候...");
          },
          success: function (result) {
            if (typeof callback == "function") {
              callback(result);
            }
            $.operate.successTabCallback(result);
          },
        };
        $.ajax(config);
      },
      // 保存结果弹出msg刷新table表格
      ajaxSuccess: function (result) {
        if (
          result.code == web_status.SUCCESS &&
          table.options.type == table_type.bootstrapTable
        ) {
          $.modal.msgSuccess(result.msg);
          $.table.refresh();
        } else if (
          result.code == web_status.SUCCESS &&
          table.options.type == table_type.bootstrapTreeTable
        ) {
          $.modal.msgSuccess(result.msg);
          $.treeTable.refresh();
        } else if (
          result.code == web_status.SUCCESS &&
          $.common.isEmpty(table.options.type)
        ) {
          $.modal.msgSuccess(result.msg);
        } else if (result.code == web_status.WARNING) {
          $.modal.alertWarning(result.msg);
        } else {
          $.modal.alertError(result.msg);
        }
        $.modal.closeLoading();
      },
      // 保存结果重新加载页面
      saveReload: function (result) {
        if (result.code == web_status.SUCCESS) {
          $.modal.msgSuccessReload(result.msg);
        } else if (result.code == web_status.WARNING) {
          $.modal.alertWarning(result.msg);
        } else {
          $.modal.alertError(result.msg);
        }
        $.modal.closeLoading();
      },
      // 成功回调执行事件（父窗体静默更新）
      successCallback: function (result) {
        if (result.code == web_status.SUCCESS) {
          var parent = activeWindow();
          if ($.common.isEmpty(parent.table)) {
            $.modal.msgSuccessReload(result.msg);
          } else if (parent.table.options.type == table_type.bootstrapTable) {
            parent.$.modal.msgSuccess(result.msg);
            parent.$.table.refresh();
          } else if (
            parent.table.options.type == table_type.bootstrapTreeTable
          ) {
            parent.$.modal.msgSuccess(result.msg);
            parent.$.treeTable.refresh();
          } else {
            parent.$.modal.msgSuccess(result.msg);
          }
          $.modal.close();
        } else if (result.code == web_status.WARNING) {
          $.modal.alertWarning(result.msg);
        } else {
          $.modal.alertError(result.msg);
        }
        $.modal.closeLoading();
        $.modal.enable();
      },
      // 选项卡成功回调执行事件（父窗体静默更新）
      successTabCallback: function (result) {
        if (result.code == web_status.SUCCESS) {
          var topWindow = $(window.parent.document);
          var currentId = $(".page-tabs-content", topWindow)
            .find(".active")
            .attr("data-panel");
          var topWindow = $(
            '.RuoYi_iframe[data-id="' + currentId + '"]',
            topWindow
          )[0];
          if (
            $.common.isNotEmpty(topWindow) &&
            $.common.isNotEmpty(currentId)
          ) {
            var $contentWindow = topWindow.contentWindow;
            $contentWindow.$.modal.msgSuccess(result.msg);
            $contentWindow.$(".layui-layer-padding").removeAttr("style");
            if (
              $contentWindow.table.options.type == table_type.bootstrapTable
            ) {
              $contentWindow.$.table.refresh();
            } else if (
              $contentWindow.table.options.type == table_type.bootstrapTreeTable
            ) {
              $contentWindow.$.treeTable.refresh();
            }
          } else {
            $.modal.msgSuccess(result.msg);
          }
          $.modal.close();
          $.modal.closeTab();
        } else if (result.code == web_status.WARNING) {
          $.modal.alertWarning(result.msg);
        } else {
          $.modal.alertError(result.msg);
        }
        $.modal.closeLoading();
      },
    },
    // 校验封装处理
    validate: {
      // 表单验证
      form: function (formId) {
        var currentId = $.common.isEmpty(formId)
          ? $("form").attr("id")
          : formId;
        return $("#" + currentId)
          .validate()
          .form();
      },
      // 重置表单验证（清除提示信息）
      reset: function (formId) {
        var currentId = $.common.isEmpty(formId)
          ? $("form").attr("id")
          : formId;
        return $("#" + currentId)
          .validate()
          .resetForm();
      },
    },
    // 树插件封装处理
    tree: {
      _option: {},
      _lastValue: {},
      // 初始化树结构
      init: function (options) {
        var defaults = {
          id: "tree", // 属性ID
          expandLevel: 0, // 展开等级节点
          view: {
            selectedMulti: false, // 设置是否允许同时选中多个节点
            nameIsHTML: true, // 设置 name 属性是否支持 HTML 脚本
          },
          check: {
            enable: false, // 置 zTree 的节点上是否显示 checkbox / radio
            nocheckInherit: true, // 设置子节点是否自动继承
            chkboxType: { Y: "ps", N: "ps" }, // 父子节点的关联关系
          },
          data: {
            key: {
              title: "title", // 节点数据保存节点提示信息的属性名称
            },
            simpleData: {
              enable: true, // true / false 分别表示 使用 / 不使用 简单数据模式
            },
          },
        };
        var options = $.extend(defaults, options);
        $.tree._option = options;
        // 树结构初始化加载
        var setting = {
          callback: {
            onClick: options.onClick, // 用于捕获节点被点击的事件回调函数
            onCheck: options.onCheck, // 用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
            onDblClick: options.onDblClick, // 用于捕获鼠标双击之后的事件回调函数
          },
          check: options.check,
          view: options.view,
          data: options.data,
        };
        $.get(options.url, function (data) {
          var treeId = $("#treeId").val();
          tree = $.fn.zTree.init($("#" + options.id), setting, data);
          $._tree = tree;
          for (var i = 0; i < options.expandLevel; i++) {
            var nodes = tree.getNodesByParam("level", i);
            for (var j = 0; j < nodes.length; j++) {
              tree.expandNode(nodes[j], true, false, false);
            }
          }
          var node = tree.getNodesByParam("id", treeId, null)[0];
          $.tree.selectByIdName(treeId, node);
          // 回调tree方法
          if (typeof options.callBack === "function") {
            options.callBack(tree);
          }
        });
      },
      // 搜索节点
      searchNode: function () {
        // 取得输入的关键字的值
        var value = $.common.trim($("#keyword").val());
        if ($.tree._lastValue == value) {
          return;
        }
        // 保存最后一次搜索名称
        $.tree._lastValue = value;
        var nodes = $._tree.getNodes();
        // 如果要查空字串，就退出不查了。
        if (value == "") {
          $.tree.showAllNode(nodes);
          return;
        }
        $.tree.hideAllNode(nodes);
        // 根据搜索值模糊匹配
        $.tree.updateNodes($._tree.getNodesByParamFuzzy("name", value));
      },
      // 根据Id和Name选中指定节点
      selectByIdName: function (treeId, node) {
        if ($.common.isNotEmpty(treeId) && node && treeId == node.id) {
          $._tree.selectNode(node, true);
        }
      },
      // 显示所有节点
      showAllNode: function (nodes) {
        nodes = $._tree.transformToArray(nodes);
        for (var i = nodes.length - 1; i >= 0; i--) {
          if (nodes[i].getParentNode() != null) {
            $._tree.expandNode(nodes[i], true, false, false, false);
          } else {
            $._tree.expandNode(nodes[i], true, true, false, false);
          }
          $._tree.showNode(nodes[i]);
          $.tree.showAllNode(nodes[i].children);
        }
      },
      // 隐藏所有节点
      hideAllNode: function (nodes) {
        var nodes = $._tree.transformToArray(nodes);
        for (var i = nodes.length - 1; i >= 0; i--) {
          $._tree.hideNode(nodes[i]);
        }
      },
      // 显示所有父节点
      showParent: function (treeNode) {
        var parentNode;
        while ((parentNode = treeNode.getParentNode()) != null) {
          $._tree.showNode(parentNode);
          $._tree.expandNode(parentNode, true, false, false);
          treeNode = parentNode;
        }
      },
      // 显示所有孩子节点
      showChildren: function (treeNode) {
        if (treeNode.isParent) {
          for (var idx in treeNode.children) {
            var node = treeNode.children[idx];
            $._tree.showNode(node);
            $.tree.showChildren(node);
          }
        }
      },
      // 更新节点状态
      updateNodes: function (nodeList) {
        $._tree.showNodes(nodeList);
        for (var i = 0, l = nodeList.length; i < l; i++) {
          var treeNode = nodeList[i];
          $.tree.showChildren(treeNode);
          $.tree.showParent(treeNode);
        }
      },
      // 获取当前被勾选集合
      getCheckedNodes: function (column) {
        var _column = $.common.isEmpty(column) ? "id" : column;
        var nodes = $._tree.getCheckedNodes(true);
        return $.map(nodes, function (row) {
          return row[_column];
        }).join();
      },
      // 不允许根父节点选择
      notAllowParents: function (_tree) {
        var nodes = _tree.getSelectedNodes();
        if (nodes.length == 0) {
          $.modal.msgError("请选择节点后提交");
          return false;
        }
        for (var i = 0; i < nodes.length; i++) {
          if (nodes[i].level == 0) {
            $.modal.msgError("不能选择根节点（" + nodes[i].name + "）");
            return false;
          }
          if (nodes[i].isParent) {
            $.modal.msgError("不能选择父节点（" + nodes[i].name + "）");
            return false;
          }
        }
        return true;
      },
      // 不允许最后层级节点选择
      notAllowLastLevel: function (_tree) {
        var nodes = _tree.getSelectedNodes();
        for (var i = 0; i < nodes.length; i++) {
          if (!nodes[i].isParent) {
            $.modal.msgError("不能选择最后层级节点（" + nodes[i].name + "）");
            return false;
          }
        }
        return true;
      },
      // 隐藏/显示搜索栏
      toggleSearch: function () {
        $("#search").slideToggle(200);
        $("#btnShow").toggle();
        $("#btnHide").toggle();
        $("#keyword").focus();
      },
      // 折叠
      collapse: function () {
        $._tree.expandAll(false);
      },
      // 展开
      expand: function () {
        $._tree.expandAll(true);
      },
    },
    // 通用方法封装处理
    common: {
      // 判断字符串是否为空
      isEmpty: function (value) {
        if (
          value == null ||
          this.trim(value) == "" ||
          value == undefined ||
          value == "undefined"
        ) {
          return true;
        }
        return false;
      },
      // 判断一个字符串是否为非空串
      isNotEmpty: function (value) {
        return !$.common.isEmpty(value);
      },
      // 如果值是空，则返回指定默认字符串，否则返回字符串本身
      nullToDefault: function (value, defaultValue) {
        return $.common.isEmpty(value) ? defaultValue : value;
      },
      // 空对象转字符串
      nullToStr: function (value) {
        if ($.common.isEmpty(value)) {
          return "-";
        }
        return value;
      },
      // 是否显示数据 为空默认为显示
      visible: function (value) {
        if ($.common.isEmpty(value) || value == true) {
          return true;
        }
        return false;
      },
      // 空格截取
      trim: function (value) {
        if (value == null) {
          return "";
        }
        return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
      },
      // 比较两个字符串（大小写敏感）
      equals: function (str, that) {
        return str == that;
      },
      // 比较两个字符串（大小写不敏感）
      equalsIgnoreCase: function (str, that) {
        return String(str).toUpperCase() === String(that).toUpperCase();
      },
      // 将字符串按指定字符分割
      split: function (str, sep, maxLen) {
        if ($.common.isEmpty(str)) {
          return null;
        }
        var value = String(str).split(sep);
        return maxLen ? value.slice(0, maxLen - 1) : value;
      },
      // 字符串格式化(%s )
      sprintf: function (str) {
        var args = arguments,
          flag = true,
          i = 1;
        str = str.replace(/%s/g, function () {
          var arg = args[i++];
          if (typeof arg === "undefined") {
            flag = false;
            return "";
          }
          return arg == null ? "" : arg;
        });
        return flag ? str : "";
      },
      // 日期格式化 时间戳  -> yyyy-MM-dd HH-mm-ss
      dateFormat: function (date, format) {
        var that = this;
        if (that.isEmpty(date)) return "";
        if (!date) return;
        if (!format) format = "yyyy-MM-dd";
        switch (typeof date) {
          case "string":
            date = new Date(date.replace(/-/g, "/"));
            break;
          case "number":
            date = new Date(date);
            break;
        }
        if (!date instanceof Date) return;
        var dict = {
          yyyy: date.getFullYear(),
          M: date.getMonth() + 1,
          d: date.getDate(),
          H: date.getHours(),
          m: date.getMinutes(),
          s: date.getSeconds(),
          MM: ("" + (date.getMonth() + 101)).substr(1),
          dd: ("" + (date.getDate() + 100)).substr(1),
          HH: ("" + (date.getHours() + 100)).substr(1),
          mm: ("" + (date.getMinutes() + 100)).substr(1),
          ss: ("" + (date.getSeconds() + 100)).substr(1),
        };
        return format.replace(/(yyyy|MM?|dd?|HH?|ss?|mm?)/g, function () {
          return dict[arguments[0]];
        });
      },
      // 获取节点数据，支持多层级访问
      getItemField: function (item, field) {
        var value = item;
        if (typeof field !== "string" || item.hasOwnProperty(field)) {
          return item[field];
        }
        var props = field.split(".");
        for (var p in props) {
          value = value && value[props[p]];
        }
        return value;
      },
      // 指定随机数返回
      random: function (min, max) {
        return Math.floor(Math.random() * max + min);
      },
      // 判断字符串是否是以start开头
      startWith: function (value, start) {
        var reg = new RegExp("^" + start);
        return reg.test(value);
      },
      // 判断字符串是否是以end结尾
      endWith: function (value, end) {
        var reg = new RegExp(end + "$");
        return reg.test(value);
      },
      // 数组去重
      uniqueFn: function (array) {
        var result = [];
        var hashObj = {};
        for (var i = 0; i < array.length; i++) {
          if (!hashObj[array[i]]) {
            hashObj[array[i]] = true;
            result.push(array[i]);
          }
        }
        return result;
      },
      // 数组中的所有元素放入一个字符串
      join: function (array, separator) {
        if ($.common.isEmpty(array)) {
          return null;
        }
        return array.join(separator);
      },
      // 获取form下所有的字段并转换为json对象
      formToJSON: function (formId) {
        var json = {};
        $.each($("#" + formId).serializeArray(), function (i, field) {
          if (json[field.name]) {
            json[field.name] += "," + field.value;
          } else {
            json[field.name] = field.value;
          }
        });
        return json;
      },
      // 数据字典转下拉框
      dictToSelect: function (datas, value, name) {
        var actions = [];
        actions.push(
          $.common.sprintf("<select class='form-control' name='%s'>", name)
        );
        $.each(datas, function (index, dict) {
          actions.push($.common.sprintf("<option value='%s'", dict.dictValue));
          if (dict.dictValue == "" + value) {
            actions.push(" selected");
          }
          actions.push($.common.sprintf(">%s</option>", dict.dictLabel));
        });
        actions.push("</select>");
        return actions.join("");
      },
      // 获取obj对象长度
      getLength: function (obj) {
        var count = 0;
        for (var i in obj) {
          if (obj.hasOwnProperty(i)) {
            count++;
          }
        }
        return count;
      },
      // 判断移动端
      isMobile: function () {
        return navigator.userAgent.match(
          /(Android|iPhone|SymbianOS|Windows Phone|iPad|iPod)/i
        );
      },
      // 数字正则表达式，只能为0-9数字
      numValid: function (text) {
        var patten = new RegExp(/^[0-9]+$/);
        return patten.test(text);
      },
      // 英文正则表达式，只能为a-z和A-Z字母
      enValid: function (text) {
        var patten = new RegExp(/^[a-zA-Z]+$/);
        return patten.test(text);
      },
      // 英文、数字正则表达式，必须包含（字母，数字）
      enNumValid: function (text) {
        var patten = new RegExp(/^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]+$/);
        return patten.test(text);
      },
      // 英文、数字、特殊字符正则表达式，必须包含（字母，数字，特殊字符!@#$%^&*()-=_+）
      charValid: function (text) {
        var patten = new RegExp(
          /^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#\$%\^&\*\(\)\-=_\+])[A-Za-z\d~!@#\$%\^&\*\(\)\-=_\+]{6,}$/
        );
        return patten.test(text);
      },
    },
  });
})(jQuery);

/** 表格类型 */
table_type = {
  bootstrapTable: 0,
  bootstrapTreeTable: 1,
};

/** 消息状态码 */
web_status = {
  SUCCESS: 0,
  FAIL: 500,
  WARNING: 301,
};

/** 弹窗状态码 */
modal_status = {
  SUCCESS: "success",
  FAIL: "error",
  WARNING: "warning",
};
